package com.un.ebs.sys.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.un.ebs.core.UserContext;
import com.un.ebs.sys.domain.*;
import com.un.ebs.sys.dto.PowerDto;
import com.un.ebs.sys.dto.UserAddDto;
import com.un.ebs.sys.dto.UserDto;
import com.un.ebs.sys.dto.UserRegisterByWxDto;
import me.chanjar.weixin.mp.bean.result.WxMpUser;

import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author liubo
 * @since 2019-09-15
 */
public interface UserService extends IService<User> {

    /**
     * 创建用户，需要当前用户具备相应权限
     *
     * @param req
     */
    void add(UserAddDto req);

    /**
     * 作为客户的用户进行注册，无需权限的注册
     *
     * @param req
     * @return user.id
     */
    User addByWx(UserRegisterByWxDto req);

    User addByWx(String name, String openId, String handImage, String tenantId);

    User addByWx(String name, String phone, String openId, String handImage, String tenantId);

    /**
     * 解除微信绑定
     */
    void cancelWxBind(String openId, String tenantId);

    /**
     * 查询用户头像
     *
     * @param userId
     * @return
     */
    String queryUserHandImage(String userId, String tenantId);

    /**
     * 修改用户密码
     *
     * @param oldPwd
     * @param newPwd
     * @param userId
     */
    void changePwd(String oldPwd, String newPwd, String userId);

    /**
     * 为用户设置角色
     *
     * @param userId
     * @param roleIds
     */
    void setRole(String userId, List<String> roleIds);

    /**
     * 删除用户
     *
     * @param id
     */
    void delete(String id);

    /**
     * 发送手机验证码
     *
     * @param phone
     */
    void sendRegisterCode(String phone);

    /**
     * 发送手机验证码
     *
     * @param phone
     * @param tenantId
     */
    void sendRegisterCode(String phone, String tenantId);

    /**
     * 验证手机验证码
     *
     * @param phone
     * @param code
     * @return
     */
    boolean checkRegisterCode(String phone, String code);

    /**
     * 绑定到现有用户；
     *
     * @param phone
     * @param tenantId
     */
    void bindUserToPersonnel(String openId, String phone, String tenantId);

    /**
     * 将openId绑定客户
     *
     * @param openId 为此openId的用户
     * @param phone  此手机号码的客户
     * @param code   此手机号码的验证码
     */
    void bindOpenId(String openId, String phone, String code);

    /**
     * 将openId绑定到EBS用户
     *
     * @param openId
     * @param phone
     * @param code
     * @param tenantId
     */
    void bindOpenId(String openId, String phone, String code, String tenantId);

    /**
     * 根据OpenID创建用户
     *
     * @param openId
     * @param tenantId 指定的租户
     * @return
     */
    User createOpenIdUser(String openId, String tenantId);

    /**
     * 检查OpenId的绑定状态
     *
     * @param openId
     * @return
     */
    boolean bindStatus(String openId);

    boolean bindStatus(String openId, String tenantId);

    /**
     * 登录
     *
     * @param username
     * @param password
     * @return
     */
    String login(String username, String password, String tenantId, String openId, WxMpUser wxMpUser);

    /**
     * 登录，以openId方式
     *
     * @param id
     * @return
     */
    String loginByOpenId(String id, String tenantId, WxMpUser wxMpUser);

    UserContext getUserContext();

    UserContext getUserContext(String userId, String tenantId);

    UserContext getUserContext(String token);

    /**
     * 创建 token
     *
     * @param userContext
     * @return
     */
    String createToken(UserContext userContext);

    /**
     * 创建OpenApi接口访问的Token
     *
     * @param userName
     * @return
     */
    String createOpenApiToken(String userName, String cnName);

    String createOpenApiToken(String userId);

    /**
     * 生成 userContext
     *
     * @param userId
     * @param currTenantId
     * @return
     */
    UserContext markUserContext(String userId, String currTenantId, WxMpUser wxMpUser);

    /**
     * 切换当前租户
     *
     * @param newTenantId
     */
    void changeCurrentTenant(String newTenantId);

    /**
     * 获取指定的用户视图
     *
     * @param userId
     * @return
     */
    UserExt getUserExt(String userId);

    /**
     * 获取用户
     *
     * @param openId
     * @return
     */
    User getUserByOpenId(String openId);

    /**
     * 获取用户
     *
     * @param openId
     * @param tenantId
     * @return
     */
    User getUserByOpenId(String openId, String tenantId);

    /**
     * 获取指定的用户视图
     *
     * @param phone
     * @param openId
     * @return
     */
    UserExt getUserExt(String phone, String openId);

    /**
     * 获取指定用户的openId
     *
     * @param userId
     * @param tenantId
     * @return
     */
    String getOpenId(String userId, String tenantId);

    String getOpenIdByEnt(String userId, String entId);

    /**
     * 获取指定openId的userId
     *
     * @param openId
     * @return
     */
    String getUserId(String openId);

    /**
     * 获取租户管理员的ID
     *
     * @param tenantId
     * @return
     */
    String queryByTenantAdminUserId(String tenantId);

    /**
     * 根据用户查权限
     *
     * @param id
     * @return
     */
    List<UserPowerExt> queryPowerByUserId(String id);

    List<PowerDto> queryPower();

    /**
     * 根据用户查角色
     *
     * @param id
     * @return
     */
    List<UserRoleExt> queryRoleByUserId(String id);

    /**
     * 根据用户查应用
     *
     * @param id
     * @return
     */
    List<UserAppExt> queryAppByUserId(String id);

    /**
     * 查询当前角色
     *
     * @return
     */
    List<AppUserRoleExt> queryCurrRoles();

    /**
     * 当前用户是否有指定的角色。
     *
     * @param roleId
     * @return
     */
    boolean hasRole(String roleId);

    /**
     * 按用户名查询
     *
     * @param userName
     * @return
     */
    User queryByUserName(String userName);

    /**
     * 查询微信用户
     *
     * @param tenantId
     * @param openId
     * @return
     */
    UserWx queryUserWx(String tenantId, String openId);

    /**
     * 查询微信用户
     *
     * @param tenantId
     * @param userId
     * @return
     */
    UserWx queryUserWxByUser(String tenantId, String userId);

    User queryByPersonnelId(String id);

    /**
     * 查询指定企业名下的所有ApiRequest用户
     *
     * @param entId
     * @return
     */
    List<UserDto> queryApiRequestUser(String entId);
}
